# Python 数据结构之元组 Tuple

# 元组是另一种有序的集合数据类型，它可以存储一系列不可变的对象。
# 元组的元素是通过逗号分隔的，并在括号中表示。
# 元组的元素可以是任意类型，包括列表、字典、集合等。

# 元组运算符
# 1. + 运算符：用于拼接两个元组
# 2. * 运算符：用于重复元组
# 3. in 运算符：用于判断元素是否在元组中
# 4. not in 运算符：用于判断元素是否不在元组中
# 5. == 运算符：用于判断两个元组是否相等
# 6. != 运算符：用于判断两个元组是否不相等
# 7. [] 运算符：用于访问元组中的元素
print("重复3次元组:", (1, 2, 3) * 3)


# 元组方法
# 1. count() 方法：用于计算元组中某个元素出现的次数
# 2. index() 方法：用于查找某个元素在元组中的索引位置
print("位置:", (1, 2, 3, 4, 5).index(4))


# 元组的内置函数
# 1. len() 函数：用于计算元组的长度
# 2. max() 函数：用于查找元组中的最大值
# 3. min() 函数：用于查找元组中的最小值
# 4. sum() 函数：用于计算元组中所有元素的和
# 5. sorted() 函数：用于对元组进行排序
# 6. tuple() 函数：用于将列表转换为元组
print("转换后的元组为:", tuple([1, 2, 3, 4, 5]))


# 创建元组
# 语法：tuple = (item1, item2, item3,...)
# 示例：
# 创建一个包含三个元素的元组
my_tuple = (1, 2, 3)
print(my_tuple)  # Output: (1, 2, 3)


# 访问元组元素
# 语法：tuple[index]
# 示例：
# 访问第一个元素
print(my_tuple[0])  # Output: 1
# 访问最后一个元素
print(my_tuple[-1])  # Output: 3


# 修改元组元素
# 远足不允许修改元组元素，因为元组是不可变的。
# 示例：
tup1 = ('aaa', 'bbb', 'ccc')
# 修改第一个元素
# tup1[0] = 'xxx'  # 错误，元组是不可变的


# 删除元组元素
# 元组中的元素是不可删除的，但可以使用del语句来删除整个元组。
# 示例：
del tup1
# print(tup1)  # 错误，变量"tup1"不存在


# 元组拼接
# 语法：tuple1 + tuple2
# 示例：
# 合并两个元组
tup1 = (1, 2, 3)
tup2 = ('a', 'b', 'c')
tup3 = tup1 + tup2
print("拼接后的元组为：", tup3)  # Output: (1, 2, 3, 'a', 'b', 'c')


# 元组的遍历
# 语法：for item in tuple:
# 示例：
# 遍历元组
for item in my_tuple:
    print(item)  # Output: 1 2 3


# 元组的长度
# 语法：len(tuple)
# 示例：
# 计算元组的长度
print("元组的长度为：", len(my_tuple))  # Output: 3


# 元组的切片
# 语法：tuple[start:end:step]
# 示例：
# 切片元组
print("切片后的元组为：", my_tuple[1:3])  # Output: (2, 3)
print("步长为2的切片后的元组为：", my_tuple[0:3:2])  # Output: (1, 3)


# 元组的比较
# 语法：tuple1 == tuple2
# 示例：
# 比较两个元组是否相等
tup1 = (1, 2, 3)
tup2 = (1, 2, 3)
print(tup1 == tup2)  # Output: True

import operator
print(operator.eq(tup1, tup2))  # Output: True


# 元组的复制
# 语法：tuple1[:] 或 tuple1[::]
# 示例：
# 复制元组
tup1 = (1, 2, 3)
tup2 = tup1[:]  # 复制整个元组
print(tup2)  # Output: (1, 2, 3)
tup3 = tup1[::]  # 复制整个元组
print(tup3)  # Output: (1, 2, 3)


# 元组的排序
# 语法：sorted(tuple)
# 示例：
# 排序元组
tup1 = (3, 1, 4, 2)
tup2 = sorted(tup1)
print("排序后的元组为：", tup2)  # Output: [1, 2, 3, 4]


# 元组的反转
# 语法：tuple[::-1]
# 示例：
# 反转元组
tup1 = (1, 2, 3, 4)
tup2 = tup1[::-1]
print("反转后的元组为：", tup2)  # Output: (4, 3, 2, 1)


# 元组的嵌套
# 语法：tuple1 = (item1, item2, (item3, item4), item5,...)
# 示例：
# 嵌套元组
tup1 = (1, 2, (3, 4), 5)
print("嵌套元组为：", tup1)  # Output: (1, 2, (3, 4), 5)
print("元组索引为2的元素为：", tup1[2])  # Output: (3, 4)
print("元组索引为2的元素索引为0的元素为：", tup1[2][0])  # Output: 3
print("元组索引为2的元素索引为1的元素为：",tup1[2][1])  # Output: 4


# 元组的元组
# 语法：tuple1 = ((item1, item2), (item3, item4), ...)
# 示例：
# 元组的元组
tup1 = ((1, 2), (3, 4), (5, 6))
print("元组的元组为：", tup1)  # Output: ((1, 2), (3, 4), (5, 6))
print("元组索引为1的元素为：", tup1[1])  # Output: (3, 4)
print("元组索引为1的元素索引为0的元素为：", tup1[1][0])  # Output: 3
print("元组索引为1的元素索引为1的元素为：", tup1[1][1])  # Output: 4


# 元组的字典
# 语法：tuple1 = (item1, item2, {key1:value1, key2:value2}, item3, ...)
# 示例：
# 元组的字典
tup1 = (1, 2, {'name': 'Alice', 'age': 20}, 3)
print("元组的字典为：", tup1)  # Output: (1, 2, {'name': 'Alice', 'age': 20}, 3)
print("元组索引为2的元素为：", tup1[2])  # Output: {'name': 'Alice', 'age': 20}
print("元组索引为2的元素的键为：", tup1[2]['name'])  # Output: Alice
print("元组索引为2的元素的值为：", tup1[2]['age'])  # Output: 20


# 元组的集合
# 语法：tuple1 = (item1, item2, {item3, item4, ...}, item5, ...)
# 示例：
# 元组的集合
tup1 = (1, 2, {3, 4, 5}, 6)
print("元组的集合为：", tup1)  # Output: (1, 2, {3, 4, 5}, 6)
print("元组索引为2的元素为：", tup1[2])  # Output: {3, 4, 5}
print("元组索引为2的元素的第一个元素为：", tup1[2].pop())  # Output: 3
print("元组索引为2的元素的集合为：", tup1[2])  # Output: {4, 5}


